lexer grammar Javalex;

/*@rulecatch { 
  catch (RecognitionException e) {
    throw e;
}

@members {
protected void mismatch(IntStream input, int ttype, BitSet follow)
  throws RecognitionException
{
  throw new MismatchedTokenException(ttype, input);
}

public void recoverFromMismatchedSet(IntStream input, RecognitionException e, BitSet follow)
  throws RecognitionException
{
  throw e;
}
}
*/

options {
  language = Java;
  //k = 6; //ejemplo: interval, asi no cogeria int
  backtrack = true;
}

tokens {
   NUM_REAL;
   NUM_INTEGER;
   //ID_TERMINAL;
   //ID_NOTERMINAL;
}

@header {
  package samplejava.antlr;
}

//PALABRAS RESERVADAS:
//tipos
INT : 'int';
LONG: 'long';
FLOAT: 'float';

//palabras reservadas del lenguaje
TRUE : 'true';
FALSE : 'false';
IF : 'if';
ELSE: 'else';
WHILE : 'while';
FOR : 'for';
RETURN : 'return';
BREAK : 'break';
INCLUDE : 'include';
CONTINUE: 'continue';
//FIN PALABRAS RESERVADAS


BLANCO: (' ' | '\t' | '\r' | '\n') { $channel=HIDDEN; };

fragment DIGITO: ('0'..'9');

/*NUMERO : ( (DIGITO)+ '.') => (DIGITO)+ '.' (DIGITO)* {$type=NUM_REAL;} 
         | (DIGITO)+ {$type=NUM_INTEGER);}
         ;*/

NUMERO: (DIGITO)+;

fragment LETRA : ('a'..'z') | ('A'..'Z') | '_';
ID : LETRA (LETRA | DIGITO)*; //| DOT)*; //se añade punto para ej.: libreria.h
    
// CADENA: '\"' (~('\"'))* '\"';
//CARACTER: '\'' ('\\')? . '\'';


NUMBERSIGN: '#';  
DOT: '.';
COLON: ':';
SEMICOLON: ';';
COMMA: ',';
ASSIGN: '=';

LPARENTHESIS: '(';
RPARENTHESIS: ')';
LCURLY: '{'; //curly brace
RCURLY: '}';
LBRACKET: '[';
RBRACKET: ']';

QUESTION: '¿';
EXCLAMATION: '¡';
// GUION 

LESS: '<';
GREATER: '>';
//NOTEQUAL2: '¡=';
NOTEQUAL: '!=';
LESSEQUAL: '<=';
GREATEQUAL: '>=';
EQUALS: '==';
//AQUESTION: '¿=';

PLUS: '+';
MINUS: '-';
ASTERISK: '*';
DIV: '/';
MOD: '%';
POW: '^';


APLUS: '+=';
AMINUS: '-=';
AMULT: '*=';
ADIV: '/=';
AMOD: '%=';

OR: '||';
AND: '&&';
NOT: '!';

OR_BIN: '|';
AND_BIN: '&';

INC: PLUS PLUS;
DEC: MINUS MINUS;
//BOOL: TRUE | FALSE; //"true" | "false";

COMMENT_LINE: '//' (options {greedy=false;}:.)* ('\r' | '\n') { $channel=HIDDEN; };
COMENTARIO: '/*' (options {greedy=false;}:.)* '*/' { $channel=HIDDEN; };
